﻿/*
  Copyright (c) 2011, Mikheev Rostislav
  Copyright (c) 2011, FreshFarsh team

  Steel Engine source code is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License
  as published by the Free Software Foundation; either version 2
  of the License, or (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/
/**
  @author Mikheev Rostislav <hacenator@gmail.com>
  @date 23.03.2011
  @brief Logger class source code
*/
#include "log.h"

// TODO(hacenator): _BUFFER_MESSAGE to const
#define _BUFFER_MESSAGE 1024

namespace _STEEL_NAMESPACE {

Log * Log::_instance = NULL;

Log * Log::GetInstance() {
	if (_instance == NULL)
		_instance = new Log();

	return _instance;
}

Log::Log() {
	_file = new IOFile(_STEEL_LOG_FILE, _LOG_FILEMODE);
}

Log::~Log() {
  _file->Close();
}

///-----------------------------------------------------
void Log::Infof(const char * message, ...) {
	va_list ap;

	if (message != "") {
		char * buffer = new char[_BUFFER_MESSAGE];

		va_start(ap, message);
		vsprintf(buffer, message, ap);
		va_end(ap);

		Info(buffer);
	}
}
///-----------------------------------------------------
void Log::Warnf(const char * message, ...) {
	va_list ap;

	if (message != "") {
		char * buffer = new char[_BUFFER_MESSAGE];

		va_start(ap, message);
		vsprintf(buffer, message, ap);
		va_end(ap);

		Warn(buffer);
	}
}
///-----------------------------------------------------
void Log::Errorf(const char * message, ...) {
	va_list ap;

	if (message != "") {
		char * buffer = new char[_BUFFER_MESSAGE];

		va_start(ap, message);
		vsprintf(buffer, message, ap);
		va_end(ap);

    Error(buffer);
	}
}
///-----------------------------------------------------
void Log::Info(const char * message) {
	GetInstance()->_file->WriteString(message);

	_LOG_PRINTF("[INFO] ");
	_LOG_PRINTF(message);
}
///-----------------------------------------------------
void Log::Warn(const char * message) {
	GetInstance()->_file->WriteString(message);

	_LOG_PRINTF("[WARNING] ");
	_LOG_PRINTF(message);
	//printf("\n");
}
///-----------------------------------------------------
void Log::Error(const char * message) {
	GetInstance()->_file->WriteString(message);

	_LOG_PRINTF("[FATAL ERROR] ");
	_LOG_PRINTF(message);
	//printf("\n");
}
///-----------------------------------------------------
void Log::Write(const char * message) {
  Info(message);
}

}
